home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xsw / libkmem.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  8KB  |  285 lines

  1.  
  2. /*
  3.  *    @(#) libkmem.c 12.1 95/05/09 SCOINC
  4.  */
  5. /***************************************************************************
  6.  *
  7.  *    Copyright (c) 1990-1993        The Santa Cruz Operation, Inc.
  8.  *
  9.  *    All rights reserved.  No part of this program or publication may be
  10.  *    reproduced, transmitted, transcribed, stored in a retrieval system,
  11.  *    or translated into any language or computer language, in any form or
  12.  *    by any means, electronic, mechanical, magnetic, optical, chemical,
  13.  *    biological, or otherwise, without the prior written permission of:
  14.  *
  15.  *        The Santa Cruz Operation , Inc.        (408) 425-7222
  16.  *        400 Encinal St., Santa Cruz, California 95060 USA
  17.  *
  18.  **************************************************************************/
  19. /*
  20.  * Modification History
  21.  *
  22.  * S003, 24-Oct-93, rickra
  23.  *     Removed the include of xswnlist.h
  24.  *
  25.  * S002, 27-May-93, rickra
  26.  *     Woops, had a bad end of comment in Modification History.    
  27.  *
  28.  * S001, 27-May-93, rickra
  29.  *     Added some code to do virtual to pysical address translations. The
  30.  *     idea being xsw could possibly be used on a system dump...... Much
  31.  *    like "crash"...... Just an idea.....
  32.  *
  33.  * S000, 30-Sep-92, rickra
  34.  *     Added copyright and modification history
  35.  */
  36. /*LINTLIBRARY*/
  37. /*+-------------------------------------------------------------------------
  38.     libkmem.c -- /dev/kmem routines for SCO UNIX/386 (maybe other *NIX)
  39.     ...!{gatech,emory}!n4hgf!wht
  40.  
  41.   Defined functions:
  42.     kinit(write_needed)
  43.     kread(caddr,kaddr,len)
  44.     kwrite(kaddr,caddr,len)
  45.  
  46.  routines were originally written by Mike "Ford" Ditto: kudos!!!
  47. --------------------------------------------------------------------------*/
  48. /*+:EDITS:*/
  49. /*:09-25-1990-05:11-wht@n4hgf-release heh-heh x0.22 preliminary */
  50. /*:09-20-1990-00:09-wht@n4hgf-scales, sysinfo/minfo, bootinfo working */
  51. /*:09-15-1990-06:32-wht@n4hgf-adopt u386mon libraries */
  52. /*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  53. /*:08-07-1990-14:24-wht@n4hgf-nba@sysware.sysware.dk S5R31 updates */
  54. /*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  55. /*:08-01-1990-19:33-jdc@dell.com-add more error text */
  56. /*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  57. /*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  58. /*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  59. /*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  60. /*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  61. /*:12-07-1988-22:06-wht-put in test for initialized fdkmem */
  62. /*:10-27-1988-22:44-wht-creation of file */
  63.  
  64. #include <sys/types.h>
  65. #include <sys/errno.h>
  66. #include <fcntl.h>
  67. #include "include/unixincs.h"
  68. #include "include/libkmem.h"
  69. #include <syms.h>
  70.  
  71. void            leave_text ();
  72.  
  73. extern int      errno;
  74.  
  75. static int      fdkmem = -2;
  76. daddr_t         lseek ();
  77.  
  78. /*+-------------------------------------------------------------------------
  79.     kinit(write_needed)
  80. --------------------------------------------------------------------------*/
  81. void
  82. kinit (write_needed)
  83.      int             write_needed;
  84. {
  85.   if (fdkmem >= 0)
  86.     return;
  87.   if ((fdkmem = open ("/dev/kmem", (write_needed) ? O_RDWR : O_RDONLY, 0)) < 0)
  88.     {
  89.       if (write_needed)
  90.     {
  91.       leave_text ("can't open /dev/kmem for read/write access", 255);
  92.     }
  93.       else
  94.     {
  95.       leave_text ("can't open /dev/kmem for read access", 255);
  96.     }
  97.     }
  98.  
  99. }                /* end of kinit */
  100.  
  101. /*+-------------------------------------------------------------------------
  102.     kread(caddr,kaddr,len)
  103. --------------------------------------------------------------------------*/
  104. void
  105. kread (caddr, kaddr, len)
  106.      caddr_t         caddr;
  107.      daddr_t         kaddr;
  108.      int             len;
  109. {
  110.   char            s80[80];
  111.  
  112. #if defined(M_I286)
  113.   kaddr &= 0xFFFFL;
  114. #endif
  115. #if defined(mips)
  116.   kaddr &= 0x7FFFFFFFL;
  117. #endif
  118.  
  119.   if (fdkmem == -2)
  120.     leave_text ("kinit() not called", 1);
  121.  
  122.   if (lseek (fdkmem, kaddr, 0) == -1L)
  123.     {
  124.       (void) sprintf (s80, "kmem read seek error addr %08lx", kaddr);
  125.       leave_text (s80, 255);
  126.     }
  127.  
  128.   if (read (fdkmem, caddr, len) != len)
  129.     {
  130.       (void) sprintf (s80, "kmem read error len %d addr %08lx", len, kaddr);
  131.       leave_text (s80, 255);
  132.     }
  133. }                /* end of kread */
  134.  
  135. /*+-------------------------------------------------------------------------
  136.     kwrite(kaddr,caddr,len)
  137. --------------------------------------------------------------------------*/
  138. #ifdef KWRITE_NEEDED
  139. void
  140. kwrite (kaddr, caddr, len)
  141.      daddr_t         kaddr;
  142.      caddr_t         caddr;
  143.      int             len;
  144. {
  145.   char            s80[80];
  146.  
  147. #if defined(M_I286)
  148.   kaddr &= 0xFFFFL;
  149. #endif
  150.  
  151.   if (fdkmem == -2)
  152.     leave_text ("kinit() not called", 1);
  153.  
  154.   if (lseek (fdkmem, kaddr, 0) == -1L)
  155.     {
  156.       (void) sprintf (s80,
  157.               "/dev/kmem write seek error addr %08lx", kaddr);
  158.       leave_text (s80, 255);
  159.     }
  160.   if (write (fdkmem, caddr, len) != len)
  161.     {
  162.       (void) sprintf (s80,
  163.           "/dev/kmem write error addr %08lx len %08lx", kaddr, len);
  164.       leave_text (s80, 255);
  165.     }
  166. }                /* end of kwrite */
  167.  
  168. #endif
  169.  
  170.  
  171. #ifdef DO_WE_NEED_THIS
  172. /*
  173.  * The following code was take from "crash". Minor modifications where done
  174.  * to incorporate it into xsw. Why re-write code!!
  175.  */
  176. /* determine valid process table entry */
  177. int
  178. procntry (slot, prbuf)
  179.      int             slot;
  180.      struct proc    *prbuf;
  181. {
  182.   if (slot == -1)
  183.     slot = getcurproc ();
  184.  
  185.   if ((slot > vbuf.v_proc) || (slot < 0))
  186.     error ("%d out of range\n", slot);
  187.  
  188.   readmem ((long) (Proc -> n_value + slot * sizeof (struct proc)), 1, -1,
  189.                      (char *) prbuf, sizeof (struct proc), "process table");
  190.   if (!prbuf -> p_stat)
  191.     error (" %d is not a valid process\n", slot);
  192. }
  193.  
  194.  
  195. int             abortflag = 0;
  196. struct proc     prbuf;
  197.  
  198. paddr_t
  199. vtop (vaddr, slot)
  200.      unsigned long   vaddr;
  201.      int             slot;
  202. {
  203.  
  204. #define errtx(tx) {if(!abortflag)return(-1);abortflag=0;printf(tx);}
  205.   static pde_t   *KPD;
  206.   pde_t           pde, *pd;
  207.   preg_t          preg, *ppreg;
  208.   reg_t           reg;
  209.   caddr_t         hi, lo;
  210.   int             debugmode = 0;
  211.  
  212.   /* Get kernel page directory */
  213.   if (!KPD)
  214.     {
  215.       KPD = (pde_t *) (x[BX_KPD0].n_value - KVSBASE);
  216.     }
  217.   pd = KPD + ptnum (vaddr);
  218.   if (debugmode > 1)
  219.     fprintf (stderr, "vtop(%x,%d): ", vaddr, slot);
  220.   if KADDR
  221.     (vaddr)
  222.     {
  223.       if (debugmode > 1)
  224.     fprintf (stderr, "kvirt  ");
  225.     }
  226.   else
  227.     {
  228.       if (debugmode > 1)
  229.     fprintf (stderr, "must be transformed.\n");
  230. /*
  231.  * To Need to find this procedure!!!!
  232.  */
  233.       procntry (slot, &prbuf);
  234.       if (!(prbuf.p_flag & SLOAD))
  235.     fprintf (stdout, "proc is swapped out\n");
  236.       if (vaddr >= UVUBLK && pfnum (vaddr - UVUBLK) < MAXUSIZE)
  237.     {
  238.       pde = prbuf.p_ubptbl[pfnum (vaddr - UVUBLK)];
  239.       goto got_pte;
  240.     }
  241.       else if (vaddr < MAXUVADR)
  242.     {
  243.       for (ppreg = prbuf.p_region;; ppreg++)
  244.         {
  245.           readmem (ppreg, 1, slot, &preg, sizeof (preg), "pregion");
  246.           if (preg.p_reg == NULL)
  247.         break;
  248.           readmem (preg.p_reg, 1, slot, ®, sizeof (reg),
  249.                "region table entry");
  250.           if (preg.p_type == PT_STACK)
  251.         {
  252.           lo = preg.p_regva - ctob (reg.r_pgsz) + 1;
  253.           hi = preg.p_regva + 1;
  254.         }
  255.           else
  256.         {
  257.           lo = preg.p_regva;
  258.           hi = preg.p_regva + ctob (reg.r_pgsz);
  259.         }
  260.           if (vaddr < (ulong) lo || vaddr >= (ulong) hi)
  261.         continue;
  262.           readmem (reg.r_list + ctost (btoct (vaddr - (ulong) preg.p_regva)),
  263.                1, slot, &pd, sizeof (pd),
  264.                "page table pointer");
  265.           readmem (pd + pnum (vaddr), 1, slot, &pde, sizeof (pde),
  266.                "page table entry");
  267.           goto got_pte;
  268.         }
  269.     }
  270.     }
  271.  
  272.   readmem (pd, 0, slot, &pde, sizeof (pde), "page directory entry");
  273.   if (!(pde.pgm.pg_pres))
  274.     errtx ("Page Table not in core\n");
  275.   readmem ((pde_t *) ctob (pde.pgm.pg_pfn) + pnum (vaddr),
  276.        0, slot, &pde, sizeof (pde), "page table entry");
  277. got_pte:
  278.   if (!(pde.pgm.pg_pres))
  279.     errtx ("Page not in core\n");
  280.   return (ctob (pde.pgm.pg_pfn) + poff (vaddr));
  281. }
  282.  
  283. #endif
  284. /* vi: set tabstop=4 shiftwidth=4: */
  285.